#ifndef SAFTDEQUE_H
#define SAFTDEQUE_H

#include <deque>

template<class T1>
class saft_deque
{
    public:
        saft_deque();
        void push(T1); //
        bool pop(T1 &); //
        bool popback(T1 &); //
        UINT32 getsize();
        void pushfront(T1);
        virtual ~saft_deque();
        void GetAll(std::deque<T1> &);
    private:
        mutex_block m_locker;
        std::deque<T1> m_list;
};

template<class T1>
saft_deque<T1>::saft_deque()
        : m_locker("m_request_list")
{
    ;
}

template<class T1>
saft_deque<T1>::~saft_deque()
{
    ;
}

template<class T1>
UINT32 saft_deque<T1>::getsize()
{
    UINT32 x = 0;
    m_locker.lock();
    
    x = m_list.size();
    
    m_locker.unlock();
    return x;
    
}

template<class T1>
void saft_deque<T1>::push(T1 m)
{
    m_locker.lock();
    m_list.push_back(m);
    m_locker.unlock();
}

template<class T1>
void saft_deque<T1>::pushfront(T1 m)
{
    m_locker.lock();
    m_list.push_front(m);
    m_locker.unlock();
}

template<class T1>
bool saft_deque<T1>::pop(T1 &m)
{
    bool result = false;
    m_locker.lock();
    if(m_list.size())
    {
        //std::cout << "m_list size() == " << m_list.size() << std::endl;
        //printf("m_list size() %d \n",  m_list.size());
        m = m_list[0];
        m_list.pop_front();
        result = true;
    }
    m_locker.unlock();
    
    return result;
}

template<class T1>
bool saft_deque<T1>::popback(T1 &m)
{
    bool result = false;
    m_locker.lock();
    if(m_list.size())
    {
        //std::cout << "m_list size() == " << m_list.size() << std::endl;
        m = m_list[m_list.size() - 1];
        m_list.pop_back();
        result = true;
    }
    m_locker.unlock();
    
    return result;
}
template<class T1>
void saft_deque<T1>::GetAll(std::deque<T1> & a)
{
    m_locker.lock();
    if(m_list.size())
    {
        a = m_list;
        m_list.clear();
    }
    m_locker.unlock();
    
}

#endif
